package com.gandong8.es.tool.annotation;

import com.gandong8.es.tool.domain.EsAnalyzer;
import com.gandong8.es.tool.domain.EsConstant;
import com.gandong8.es.tool.domain.EsDataType;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented
public @interface EsMapping {
    /**
     * 数据类型
     */
    EsDataType datatype() default EsDataType.TEXT;

    /**
     * es不只对_id字段进行赋值的方法来使用主键进行去重, _id也可以指定为其他字段,
     * 若都不指定_id,则由es自动生成。
     */
    boolean document_id() default false;

    /**
     * 是否是时间筛选字段
     * 使用此字段搜索时可以按时间筛选需要的数据。
     */
    boolean sort_time() default false;

    /**
     * 关键字忽略字数
     * 默认256
     */
    int ignore_above() default EsConstant.ignore_above;
    /**
     * 索引分词器设置
     * 插入/更新文档时将text类型的字段先做分词然后插入倒排索引
     */
    EsAnalyzer analyzer() default EsAnalyzer.STANDARD;
    /**
     * 搜索内容分词器设置
     * 在search时候会先去判断有没有设置search_analyzer,若没再去判断analyzer,都没有的话使用ES预设的
     */
    EsAnalyzer search_analyzer() default EsAnalyzer.STANDARD;


    /**
     * 将多个field组合成一个field搜索来提高搜索效率
     * copy_to的目标字段不出现在_source中
     * _all在7.x版本已经被copy_to所代替
     */
    String copy_to() default "";

    /**
     * null_value指定，用我们选择的占位符值替换显式的空值
     * 当insert/update数据遇到空值时，将使用该值，这个显式的空值会对其进行索引，以便于搜索
     * 需要注意的是要与根本没有某字段区分（没有某字段需要用Exists Query进行查询）
     */
    String null_value() default "";

    /**
     * nested对应的类型，默认为Object.Class。
     * nested_type的类型才需要添加的注解，通过这个注解生成嵌套类型的索引
     *
     */
    Class nested_class() default Object.class;
}
